home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / linux / mroute.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  6.1 KB  |  248 lines

  1. #ifndef __LINUX_MROUTE_H
  2. #define __LINUX_MROUTE_H
  3.  
  4. #include <linux/sockios.h>
  5. #include <linux/types.h>
  6. #ifdef __KERNEL__
  7. #include <linux/in.h>
  8. #endif
  9.  
  10. /*
  11.  *    Based on the MROUTING 3.5 defines primarily to keep
  12.  *    source compatibility with BSD.
  13.  *
  14.  *    See the mrouted code for the original history.
  15.  *
  16.  *      Protocol Independent Multicast (PIM) data structures included
  17.  *      Carlos Picoto (cap@di.fc.ul.pt)
  18.  *
  19.  */
  20.  
  21. #define MRT_BASE    200
  22. #define MRT_INIT    (MRT_BASE)    /* Activate the kernel mroute code     */
  23. #define MRT_DONE    (MRT_BASE+1)    /* Shutdown the kernel mroute        */
  24. #define MRT_ADD_VIF    (MRT_BASE+2)    /* Add a virtual interface        */
  25. #define MRT_DEL_VIF    (MRT_BASE+3)    /* Delete a virtual interface        */
  26. #define MRT_ADD_MFC    (MRT_BASE+4)    /* Add a multicast forwarding entry    */
  27. #define MRT_DEL_MFC    (MRT_BASE+5)    /* Delete a multicast forwarding entry    */
  28. #define MRT_VERSION    (MRT_BASE+6)    /* Get the kernel multicast version    */
  29. #define MRT_ASSERT    (MRT_BASE+7)    /* Activate PIM assert mode        */
  30. #define MRT_PIM        (MRT_BASE+8)    /* enable PIM code    */
  31.  
  32. #define SIOCGETVIFCNT    SIOCPROTOPRIVATE    /* IP protocol privates */
  33. #define SIOCGETSGCNT    (SIOCPROTOPRIVATE+1)
  34. #define SIOCGETRPF    (SIOCPROTOPRIVATE+2)
  35.  
  36. #define MAXVIFS        32    
  37. typedef unsigned long vifbitmap_t;    /* User mode code depends on this lot */
  38. typedef unsigned short vifi_t;
  39. #define ALL_VIFS    ((vifi_t)(-1))
  40.  
  41. /*
  42.  *    Same idea as select
  43.  */
  44.  
  45. #define VIFM_SET(n,m)    ((m)|=(1<<(n)))
  46. #define VIFM_CLR(n,m)    ((m)&=~(1<<(n)))
  47. #define VIFM_ISSET(n,m)    ((m)&(1<<(n)))
  48. #define VIFM_CLRALL(m)    ((m)=0)
  49. #define VIFM_COPY(mfrom,mto)    ((mto)=(mfrom))
  50. #define VIFM_SAME(m1,m2)    ((m1)==(m2))
  51.  
  52. /*
  53.  *    Passed by mrouted for an MRT_ADD_VIF - again we use the
  54.  *    mrouted 3.6 structures for compatibility
  55.  */
  56.  
  57. struct vifctl {
  58.     vifi_t    vifc_vifi;        /* Index of VIF */
  59.     unsigned char vifc_flags;    /* VIFF_ flags */
  60.     unsigned char vifc_threshold;    /* ttl limit */
  61.     unsigned int vifc_rate_limit;    /* Rate limiter values (NI) */
  62.     struct in_addr vifc_lcl_addr;    /* Our address */
  63.     struct in_addr vifc_rmt_addr;    /* IPIP tunnel addr */
  64. };
  65.  
  66. #define VIFF_TUNNEL    0x1    /* IPIP tunnel */
  67. #define VIFF_SRCRT    0x2    /* NI */
  68. #define VIFF_REGISTER    0x4    /* register vif    */
  69.  
  70. /*
  71.  *    Cache manipulation structures for mrouted and PIMd
  72.  */
  73.  
  74. struct mfcctl
  75. {
  76.     struct in_addr mfcc_origin;        /* Origin of mcast    */
  77.     struct in_addr mfcc_mcastgrp;        /* Group in question    */
  78.     vifi_t    mfcc_parent;            /* Where it arrived    */
  79.     unsigned char mfcc_ttls[MAXVIFS];    /* Where it is going    */
  80.     unsigned int mfcc_pkt_cnt;        /* pkt count for src-grp */
  81.     unsigned int mfcc_byte_cnt;
  82.     unsigned int mfcc_wrong_if;
  83.     int         mfcc_expire;
  84. };
  85.  
  86. /* 
  87.  *    Group count retrieval for mrouted
  88.  */
  89.  
  90. struct sioc_sg_req
  91. {
  92.     struct in_addr src;
  93.     struct in_addr grp;
  94.     unsigned long pktcnt;
  95.     unsigned long bytecnt;
  96.     unsigned long wrong_if;
  97. };
  98.  
  99. /*
  100.  *    To get vif packet counts
  101.  */
  102.  
  103. struct sioc_vif_req
  104. {
  105.     vifi_t    vifi;        /* Which iface */
  106.     unsigned long icount;    /* In packets */
  107.     unsigned long ocount;    /* Out packets */
  108.     unsigned long ibytes;    /* In bytes */
  109.     unsigned long obytes;    /* Out bytes */
  110. };
  111.  
  112. /*
  113.  *    This is the format the mroute daemon expects to see IGMP control
  114.  *    data. Magically happens to be like an IP packet as per the original
  115.  */
  116.  
  117. struct igmpmsg
  118. {
  119.     __u32 unused1,unused2;
  120.     unsigned char im_msgtype;        /* What is this */
  121.     unsigned char im_mbz;            /* Must be zero */
  122.     unsigned char im_vif;            /* Interface (this ought to be a vifi_t!) */
  123.     unsigned char unused3;
  124.     struct in_addr im_src,im_dst;
  125. };
  126.  
  127. /*
  128.  *    That's all usermode folks
  129.  */
  130.  
  131. #ifdef __KERNEL__
  132. #include <linux/pim.h>
  133. #include <net/sock.h>
  134.  
  135. #ifdef CONFIG_IP_MROUTE
  136. static inline int ip_mroute_opt(int opt)
  137. {
  138.     return (opt >= MRT_BASE) && (opt <= MRT_BASE + 10);
  139. }
  140. #else
  141. static inline int ip_mroute_opt(int opt)
  142. {
  143.     return 0;
  144. }
  145. #endif
  146.  
  147. #ifdef CONFIG_IP_MROUTE
  148. extern int ip_mroute_setsockopt(struct sock *, int, char __user *, int);
  149. extern int ip_mroute_getsockopt(struct sock *, int, char __user *, int __user *);
  150. extern int ipmr_ioctl(struct sock *sk, int cmd, void __user *arg);
  151. extern int ip_mr_init(void);
  152. #else
  153. static inline
  154. int ip_mroute_setsockopt(struct sock *sock,
  155.              int optname, char __user *optval, int optlen)
  156. {
  157.     return -ENOPROTOOPT;
  158. }
  159.  
  160. static inline
  161. int ip_mroute_getsockopt(struct sock *sock,
  162.              int optname, char __user *optval, int __user *optlen)
  163. {
  164.     return -ENOPROTOOPT;
  165. }
  166.  
  167. static inline
  168. int ipmr_ioctl(struct sock *sk, int cmd, void __user *arg)
  169. {
  170.     return -ENOIOCTLCMD;
  171. }
  172.  
  173. static inline int ip_mr_init(void)
  174. {
  175.     return 0;
  176. }
  177. #endif
  178.  
  179. struct vif_device
  180. {
  181.     struct net_device     *dev;            /* Device we are using */
  182.     unsigned long    bytes_in,bytes_out;
  183.     unsigned long    pkt_in,pkt_out;        /* Statistics             */
  184.     unsigned long    rate_limit;        /* Traffic shaping (NI)     */
  185.     unsigned char    threshold;        /* TTL threshold         */
  186.     unsigned short    flags;            /* Control flags         */
  187.     __be32        local,remote;        /* Addresses(remote for tunnels)*/
  188.     int        link;            /* Physical interface index    */
  189. };
  190.  
  191. #define VIFF_STATIC 0x8000
  192.  
  193. struct mfc_cache 
  194. {
  195.     struct mfc_cache *next;            /* Next entry on cache line     */
  196.     __be32 mfc_mcastgrp;            /* Group the entry belongs to     */
  197.     __be32 mfc_origin;            /* Source of packet         */
  198.     vifi_t mfc_parent;            /* Source interface        */
  199.     int mfc_flags;                /* Flags on line        */
  200.  
  201.     union {
  202.         struct {
  203.             unsigned long expires;
  204.             struct sk_buff_head unresolved;    /* Unresolved buffers        */
  205.         } unres;
  206.         struct {
  207.             unsigned long last_assert;
  208.             int minvif;
  209.             int maxvif;
  210.             unsigned long bytes;
  211.             unsigned long pkt;
  212.             unsigned long wrong_if;
  213.             unsigned char ttls[MAXVIFS];    /* TTL thresholds        */
  214.         } res;
  215.     } mfc_un;
  216. };
  217.  
  218. #define MFC_STATIC        1
  219. #define MFC_NOTIFY        2
  220.  
  221. #define MFC_LINES        64
  222.  
  223. #ifdef __BIG_ENDIAN
  224. #define MFC_HASH(a,b)    (((((__force u32)(__be32)a)>>24)^(((__force u32)(__be32)b)>>26))&(MFC_LINES-1))
  225. #else
  226. #define MFC_HASH(a,b)    ((((__force u32)(__be32)a)^(((__force u32)(__be32)b)>>2))&(MFC_LINES-1))
  227. #endif        
  228.  
  229. #endif
  230.  
  231.  
  232. #define MFC_ASSERT_THRESH (3*HZ)        /* Maximal freq. of asserts */
  233.  
  234. /*
  235.  *    Pseudo messages used by mrouted
  236.  */
  237.  
  238. #define IGMPMSG_NOCACHE        1        /* Kern cache fill request to mrouted */
  239. #define IGMPMSG_WRONGVIF    2        /* For PIM assert processing (unused) */
  240. #define IGMPMSG_WHOLEPKT    3        /* For PIM Register processing */
  241.  
  242. #ifdef __KERNEL__
  243. struct rtmsg;
  244. extern int ipmr_get_route(struct sk_buff *skb, struct rtmsg *rtm, int nowait);
  245. #endif
  246.  
  247. #endif
  248.